package com.tedu.api.list;

import org.junit.Test;

import java.util.Deque;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

/**队列  包java.util
 * Queue、Deque队列
 * 作用:实现数据的有序存储，用于数据缓冲、多线程协调线程使用
 * Collection腚级集合下的子集:Queue集合接口
 *
 */
public class QueueAPI {
    @Test
    public void testQueue(){
      //创建队列--自己使用功能
        Queue<String> queue=new LinkedList<>();//创建出来
        /**
         * offer(E e)   返回值:boolean---add一样
         * 作用:入队操作--队尾添加元素
         */
        queue.offer("麦林炮手·崔丝塔娜");
        queue.offer("仙灵女巫·璐璐");
        queue.offer("英勇投弹手·库奇");
        queue.offer("迅捷斥候·提莫");
        System.out.println("班德尔城队列:"+queue);
        /**
         * poll()进行出队操作  你！出列   返回值：E
         * 作用:出队操作，获取队前元素，并且将元素从队列元素中删除
         */
        String str=queue.poll();
        System.out.println("班德尔城队列出队:"+str);
        System.out.println("队列:"+queue);
        /**
         * peek()  返回值:E
         * 作用:出队操作,获取队首元素,不删除队列元素数
         */
        str=queue.peek();
        System.out.println("队列出队:[peek]"+str);
        System.out.println("队列："+queue);

    }

    /**
     * 需求:队列--【历史名人】---遍历队列 while  队列历史名人
     *                               【遍历之后元素清空】
     *                               增强for 队列历史名人
     *                               【遍历之后元素存在】
     */
    @Test
    public void testHistory(){
        Queue<String> q=new LinkedList<>();
        q.offer("青钢影·卡密尔");
        q.offer("大发明家·黑默丁格");
        q.offer("未来守护者·杰斯");
        q.offer("皮城女警·凯特琳");
        System.out.println(q);
        //遍历1.while 遍历后 清空
        while(q.size()>0){
            q.poll();//出队首 去队首
        }
        System.out.println("队列："+q);
        //遍历2.增强for 遍历后 保存
        for(String str:q) {//增强for  String str    普通for int i=;i...;i++/i--
            q.peek();
        }
            System.out.println("队列：" + q);

    }

    /**
     * 双端队列 Deque
     * 作用:入队和出队操作--保存数据,可以在两端插入和删除元素
     * Deque接口中的方法：与Queue一致，拓展几个方法
     * 栈结构【业务:撤销操作】
     * 压栈:先进后出
     */
    @Test
    public void testDeque(){
        Deque<String> d=new LinkedList<>();//创建双端队列
        d.offer("沙漠皇帝·阿兹尔");
        d.offer("岩雀·塔莉亚");
        d.offer("殇之木乃伊·阿木木");
        d.offer("荒漠屠夫·雷克顿");
        System.out.println("Deque队列："+d);
        //双端增加:addFirst()  给队首添加元素  addLast()给队尾添加元素
        d.addFirst("远古巫灵·泽拉斯");d.addLast("沙漠死神·内瑟斯");
        System.out.println("双端队列:"+d);
        //双端删除:poll  peek
        d.pollFirst();//d.peekFirst();出队队首，队列中队首删除
        System.out.println("删除队首:"+d);
        d.peekFirst();//d.peekFirst();删除队首，保留队列
        System.out.println("不删除队首:"+d);
        //获取队列元素---队首、队尾---getFirst\getLast   get获取
        System.out.println("队列【队首】："+d.getFirst());
        System.out.println("队列【队尾】："+d.getLast());

    }
    /**
     * Deque接口中的方法：与Queue一致，拓展几个方法
     *  push():压栈--功能:offer一致
     *  pop():出栈---功能：pollFirst一致
     *  压栈:先进后出
     */
    @Test
    public void testStack(){
        Deque<String> stack=new LinkedList<>();//创建队列
        stack.push("傲之追猎者·雷恩加尔");
        stack.push("明烛·米利欧");
        stack.push("元素女皇·奇亚娜");
        System.out.println("以绪塔尔栈结构："+stack);
        String str=stack.pop();//出栈pop  获取尾元素
        System.out.println("栈结构【出栈】"+str);
        System.out.println("双端队列:"+stack);//双端队列大部分做撤销操作
        //队列中:pop  poll  peek方法使用特点
        //答：pop方法针对栈结构：特点：双端队列最后添加元素【队首】获取队首元素
        //poll和peek是队列结构：特点针对队列追加元素【队首】,poll获取队首元素删除
                                                   // peek获取队首元素并保存
    }
}
